package com.test33_反射;

import org.junit.Test;

import java.util.Date;

/**
 * 反射实例化对象
 */
public class Demo02_Instance {

    @Test
    public void test1() throws Exception {
        {   // 传统实例化对象
            Book2 book = new Book2();
        }
        {   // 通过Class类实例化对象
            Class<?> clazz = Class.forName("com.test33_反射.Book2");
            // JDK9开始不推荐使用
            clazz.newInstance();
        }
    }

    /**
     * 通过反射获取指定类的对象实例
     */
    @Test
    public void test2() throws Exception {
        Class<?> clazz = Class.forName("com.test33_反射.Book2");
        // Book2 book = (Book2) clazz.newInstance();
        Book2 book = (Book2) clazz.getDeclaredConstructor().newInstance();  // 强制向下转型
        book.read();
    }

    @Test
    public void test3() throws Exception {
        Class<?> clazz = Class.forName("java.util.Date");
        // 如果强制转型了，那必须进行开发包的完整导入
        Date date = (Date) clazz.newInstance();
        System.out.println(date.getTime());
    }
}

class Book2 {
    public Book2() {
        System.out.println("【Book】实例化新的Book类对象");
    }

    public void read() {
        System.out.println("认真学习李兴华老师出版的《Java从入门到项目实战》");
    }
}
